How Compilers Work